﻿#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>

typedef int LTDatatype;
//定义双向链表（结点）结构
typedef struct ListNode {
	LTDatatype data;
	struct ListNode* next;
	struct ListNode* prev;
}LTNode;

//初始化
//void LTInit(LTNode** pphead);
LTNode* LTInit();

//void LTDesTroy(LTNode** pphead);
//接口一致性,传一级，在函数调用结束后需要手动将实参置为NULL
void LTDesTroy(LTNode* phead);

// 打印
void LTPrint(LTNode* phead);
// 判断是否是空链表
bool LTEmpty(LTNode* phead);

//尾插
//phead节点不会发生改变，参数就为一级
//phead节点发生改变，参数就为二级
void LTPushBack(LTNode* phead, LTDatatype x);
// 头插
void LTPushFront(LTNode* phead, LTDatatype x);

// 尾删
void LTPopBack(LTNode* phead);
// 头删
void LTPopFront(LTNode* phead);

//在pos位置之后插⼊数据
void LTInsertAfter(LTNode* pos, LTDatatype x);
//在pos位置之前插⼊数据
void LTInsertBefore(LTNode* pos, LTDatatype x);
// 删除指定位置的数据
void LTErase(LTNode* pos);

// 查找
LTNode* LTFind(LTNode* phead, LTDatatype x);